﻿using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using MARGYE.Web.Models;
using System.Net.Mail;
using System.Net.Mime;
using System;

namespace MARGYE.Web
{
    // Configurare la gestione utenti dell'applicazione utilizzata in questa applicazione. UserManager viene definito in ASP.NET Identity e viene utilizzato dall'applicazione.
    public class ApplicationUserManager : UserManager<ApplicationUser>
    {
        public ApplicationUserManager(IUserStore<ApplicationUser> store)
            : base(store)
        {
        }

        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
        {
            var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
            // Configurare la logica di convalida per i nomi utente
            manager.UserValidator = new UserValidator<ApplicationUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };
            // Configurare la logica di convalida per le password
            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = true,
                RequireDigit = true,
                RequireLowercase = true,
                RequireUppercase = true,
            };
            // Registrare i provider di autenticazione a due fattori. Questa applicazione utilizza il telefono e gli indirizzi di posta elettronica come metodi per la ricezione di un codice per la verifica dell'utente. 
            // Per ulteriori informazioni sull'utilizzo dell'autenticazione e due fattori, vedere http://go.microsoft.com/fwlink/?LinkID=391935
            // Scrivere qui il provider e il plug-in.
            manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
            {
                MessageFormat = "Your security code is: {0}"
            });
            manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
            {
                Subject = "SecurityCode",
                BodyFormat = "Your security code is: {0}"
            });

            manager.EmailService = new EmailService();
            manager.SmsService = new SmsService();
            var dataProtectionProvider = options.DataProtectionProvider;
            if (dataProtectionProvider != null)
            {
                manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
            }
            return manager;
        }
    }

    public class EmailService : IIdentityMessageService
    {
        public Task SendAsync(IdentityMessage message)
        {
            // Eseguire qui il plug-in del servizio di posta elettronica per l'invio di un messaggio.
            //esempio:
            // http://www.hanselman.com/blog/AddingTwoFactorAuthenticationToAnASPNETApplication.aspx
            // http://www.dotnetcurry.com/showarticle.aspx?ID=1013

            //<system.net>
            //<mailSettings>
            //<smtp deliveryMethod="SpecifiedPickupDirectory">
            //<specifiedPickupDirectory pickupDirectoryLocation="C:\mailDrop"/>
            //</smtp>
            //</mailSettings>
            //</system.net>

            string text = message.Body;
            string html = message.Body;
            //do whatever you want to the message        
            MailMessage msg = new MailMessage();
            msg.From = new MailAddress("scott@hanselman.com");
            msg.To.Add(new MailAddress(message.Destination));
            msg.Subject = message.Subject;
            msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(text, null, MediaTypeNames.Text.Plain));
            msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));

            SmtpClient smtpClient = new SmtpClient("smtp.whatever.net", Convert.ToInt32(587)); // message.Destination
            System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("user","pwd");//(Keys.EmailUser, Keys.EMailKey);
            smtpClient.Credentials = credentials;
            smtpClient.Send(msg);

            return Task.FromResult(0);
        }
    }

    public class SmsService : IIdentityMessageService
    {
        public Task SendAsync(IdentityMessage message)
        {
            // Eseguire qui il plug-in del servizio SMS per l'invio di un messaggio di testo.
            //esempio:
            // http://www.hanselman.com/blog/AddingTwoFactorAuthenticationToAnASPNETApplication.aspx
            // http://www.dotnetcurry.com/showarticle.aspx?ID=1013

            //message.Destination = Keys.ToPhone; //your number here
            //var twilio = new TwilioRestClient(Keys.TwilioSid, Keys.TwilioToken);
            //var result = twilio.SendMessage(Keys.FromPhone, message.Destination, message.Body);
            
            return Task.FromResult(0);
        }
    }
}